home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / sound.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  4KB  |  200 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/iocs.h>
  5. #include <io.h>
  6. #include "otoko.h"
  7. #include "zmcall.h"
  8.  
  9. #define SE_MAX    32
  10. #define MUSIC_MAX    16
  11.  
  12.  
  13. static void *se_ptr[SE_MAX];    /* 読み込んだ .PCM データへのポインタ */
  14. static int se_size[SE_MAX];    /* ↑       のサイズ */
  15. static short se_no = 0;        /* 鳴らす効果音の番号 */
  16. static char zmusic_keep = 0;    /* ZMUSIC が常駐しているか */
  17.  
  18. static void *music_ptr[MUSIC_MAX];    /* 読み込んだ .ZMD データへのポインタ */
  19. static int music_size[MUSIC_MAX];    /* ↑       のサイズ */
  20.  
  21. extern void Tini (void);
  22.  
  23.  
  24.  
  25. /* 起動時に1回だけ呼ばれる */
  26. int SoundInit0 (void)
  27. {
  28.     FILE *fp, *fp2;
  29.     int data_no;
  30.     char str1[1024];
  31.     int i;
  32.  
  33.     for (i = 0; i < SE_MAX; i++)
  34.         se_ptr[i] = NULL;
  35.     for (i = 0; i < MUSIC_MAX; i++)
  36.         music_ptr[i] = NULL;
  37.  
  38.     /* SOUND.CNF 読み込み */
  39.     if ((fp = fopen ("SOUND.CNF", "r")) == NULL) {
  40.         static char e[256];
  41.         error_level = ERROR_MUSIC;
  42.         error_message = e;
  43.         sprintf (e, "SOUND.CNF が読み込めません\n");
  44.         Tini ();    /* 返ってこない */
  45.     }
  46.     while (fscanf (fp, "%s", str1) != EOF) {
  47.         if (ferror (fp) || feof (fp))
  48.             break;
  49.         if (!strcmpi (str1, "SE")) {
  50.             fscanf (fp, "%d %s", &data_no, &str1);
  51.             if ((fp2 = fopen (str1, "rb")) == NULL) {
  52.                 static char e[256];
  53.                 error_level = ERROR_MUSIC;
  54.                 error_message = e;
  55.                 sprintf (e, "ファイル %s が読み込めません\n", str1);
  56.                 Tini ();    /* 返ってこない */
  57.             }
  58.             se_size[data_no] = filelength (fileno (fp2));
  59.             if ((se_ptr[data_no] = malloc (se_size[data_no])) == NULL) {
  60.                 static char e[256];
  61.                 error_level = ERROR_FILE;
  62.                 error_message = e;
  63.                 sprintf (e, "効果音用メモリが足りません\n");
  64.                 Tini ();    /* 返ってこない */
  65.             }
  66.             fread (se_ptr[data_no], se_size[data_no], 1, fp2);
  67.             fclose (fp2);
  68.             fgets (str1, 1024, fp);    /* 以下読み捨てる */
  69.             continue;
  70.         }
  71.         if (!strcmpi (str1, "MUSIC")) {
  72.             fscanf (fp, "%d %s", &data_no, &str1);
  73.             if ((fp2 = fopen (str1, "rb")) == NULL) {
  74.                 static char e[256];
  75.                 error_level = ERROR_MUSIC;
  76.                 error_message = e;
  77.                 sprintf (e, "ファイル %s が読み込めません\n", str1);
  78.                 Tini ();    /* 返ってこない */
  79.             }
  80.             music_size[data_no] = filelength (fileno (fp2));
  81.             if ((music_ptr[data_no] = malloc (music_size[data_no])) == NULL) {
  82.                 static char e[256];
  83.                 error_level = ERROR_FILE;
  84.                 error_message = e;
  85.                 sprintf (e, "音楽用メモリが足りません\n");
  86.                 Tini ();    /* 返ってこない */
  87.             }
  88.             fread (music_ptr[data_no], music_size[data_no], 1, fp2);
  89.             fclose (fp2);
  90.             fgets (str1, 1024, fp);    /* 以下読み捨てる */
  91.             continue;
  92.         }
  93.         fgets (str1, 1024, fp);    /* 以下読み捨てる */
  94.         if (ferror (fp) || feof (fp))
  95.             break;
  96.     }
  97.     fclose (fp);
  98.  
  99.     if (ZmKeepCheck ()){
  100. #if    0
  101.     /* ZMUSIC が常駐していなくても実行できる */
  102.     /* (EX68 対策という話も←よく知らないけど) */
  103.         static char e[256];
  104.         error_level = ERROR_MUSIC;
  105.         error_message = e;
  106.         sprintf (e, "ZMUSIC が常駐していません\n");
  107.         Tini ();    /* 返ってこない */
  108. #endif
  109.     } else {
  110.         zmusic_keep = !0;
  111.         ZmInit ();
  112.     }
  113.  
  114.     return (0);
  115. }
  116.  
  117.  
  118.  
  119. /* 効果音をセットする(けど鳴らさない) */
  120. void SoundSetSE (short no)
  121. {
  122.     /* 優先順位を判定 */
  123.     if (no > se_no)
  124.         se_no = no;
  125. }
  126.  
  127.  
  128. /* 効果音を鳴らす */
  129. void SoundMove (void)
  130. {
  131.     if (se_no) {
  132.         if (se_ptr[se_no]) {
  133.             if (zmusic_keep) {
  134.                 ZmAdpcmSE (se_ptr[se_no], se_size[se_no], 4 * 256 + 3, se_no);
  135.             } else {
  136.                 if (_iocs_adpcmsns ())    /* 今鳴っていたら止める */
  137.                     _iocs_adpcmmod (0);
  138.                 _iocs_adpcmout (se_ptr[se_no], 4 * 256 + 3, se_size[se_no]);
  139.             }
  140.         }
  141.         se_no = 0;
  142.     }
  143. }
  144.  
  145.  
  146.  
  147. /* 音楽を鳴らす */
  148. void SoundMusic (int no)
  149. {
  150.     if ((zmusic_keep) && (music_ptr[no]))
  151.         ZmPlay (music_ptr[no], music_size[no]);
  152. }
  153.  
  154.  
  155.  
  156. /* 音楽をフェードアウトする */
  157. void SoundFadeOut (int no)
  158. {
  159.     if (zmusic_keep)
  160.         ZmFadeOut (no);
  161. }
  162.  
  163.  
  164.  
  165. /* 音楽を止める */
  166. void SoundStop (void)
  167. {
  168.     if (zmusic_keep)
  169.         ZmStop ();
  170. }
  171.  
  172.  
  173.  
  174. /* ゲームオーバー時に呼ばれる */
  175. void SoundTini (void)
  176. {
  177.     if (zmusic_keep)
  178.         ZmFadeOut (64);
  179. }
  180.  
  181.  
  182.  
  183. /* 終了時に1回だけ呼ばれる */
  184. void SoundTini0 (void)
  185. {
  186.     int i;
  187.  
  188.     if (zmusic_keep)
  189.         ZmFadeOut (64);
  190.  
  191.     for (i = 0; i < SE_MAX; i++) {
  192.         if (se_ptr[i] != NULL)
  193.             free (se_ptr[i]);
  194.     }
  195.     for (i = 0; i < MUSIC_MAX; i++) {
  196.         if (music_ptr[i] != NULL)
  197.             free (music_ptr[i]);
  198.     }
  199. }
  200.